package com.app.framework.utils;

import com.app.exception.BusinessException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 上传工具类
 */
public class FileUtils {

    /**
     * 文件上传并转换为Webp
     *
     * @param multipartFile 上传的文件
     * @param path          文件存储的路径
     * @param fileRoot      文件存储的根路径
     * @throws IOException IO异常
     */
    public static String fileUpload(MultipartFile multipartFile, String path, String fileRoot) throws IOException {
        //生成一个雪花ID作为文件名
        Long id = StringsUtils.generateSnowflakeId();
        //使用当前日期生成子目录路径/格式为：/yyyy/MM/dd/
        String date = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
        //获取不带点的文件后缀名
        String suffix = getFileExtension(multipartFile);
        //构建文件对象/包括存储路径、文件名（雪花ID + 后缀）
        File file = new File(fileRoot + date + suffix, id + "." + suffix);
        //如果文件的父目录不存在/则创建该目录
        if (!file.getParentFile().exists()) {
            //创建路径
            boolean mkdirs = file.getParentFile().mkdirs();
        }
        //将上传的文件保存到指定路径
        multipartFile.transferTo(file);
        //如果不是图像文件、则返回原文件相对路径
        return "/file/" + path + date + suffix + "/" + id + "." + suffix;
    }

    /**
     * 获取文件MD5
     */
    public static String getMd5(MultipartFile multipartFile) {
        try {
            //获取文件的byte信息
            byte[] uploadBytes = multipartFile.getBytes();
            //拿到一个MD5转换器
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(uploadBytes);
            //转换为16进制
            return new BigInteger(1, digest).toString(16);
        } catch (Exception e) {
            throw new BusinessException("获取文件MD5错误");
        }
    }

    /**
     * 获取文件后缀
     *
     * @param file 文件
     */
    public static String getFileExtension(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        if (originalFilename != null) {
            int extensionIndex = originalFilename.lastIndexOf(".");
            if (extensionIndex != -1) {
                return originalFilename.substring(extensionIndex + 1);
            }
        }
        return null;
    }

    /**
     * 删除文件
     *
     * @param filePath 文件路径
     */
    public static void deleteFile(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            Boolean deleted = file.delete();
        }
    }

}